package com.jbp.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jbp.exception.RRException;
import com.jbp.model.LoginParam;
import com.jbp.model.User;
import com.jbp.redis.RedisConfigService;
import com.jbp.service.*;
import com.jbp.utils.*;
import com.jbp.service.QqLoginUtil;
import com.jbp.service.WxLoginUtil;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class AccountServiceImpl implements AccountService {

    private static final Logger logger = LoggerFactory.getLogger(AccountServiceImpl.class);

    @Autowired
    private UserService userService;

    @Autowired
    private RedisConfigService redisConfigService;

    @Autowired
    private LoginLogService loginLogService;

    @Autowired
    private WxLoginUtil wxLoginUtil;
    @Autowired
    private QqLoginUtil qqLoginUtil;
    /**
     * 绑定手机号
     * 包括两种情况，如果是绑定的本机号码，就不需要发送验证码；如果是其他手机号，需要先发送验证码。
     * 但是对于这两种情况，在接口调用这里是一致的；如果是其他手机号，在app中需要调用短信接口，验证了这个手机号后再调用后台接口
     * <p>
     * 1. 判断这个手机号是否被绑定过，如果被绑定过，返回异常信息
     * 2. 如果这个手机号没有被绑定过，修改user表中的phone字段
     *
     * @return
     */
    @Override
    public void bindPhone(LoginParam loginParam) {
        // 2. 在user表中查询该qq的openid是否存在，如果存在抛异常
        User usercheck = userService.getOne(new QueryWrapper<User>().eq("mobile", loginParam.getMobile()));
        if (usercheck != null) {
            throw new RRException("该手机号已经绑定过");
        }
        // 3. 获取用户，并设置微信用户名和昵称
        User user = userService.getById(loginParam.getUserId());
        if (user.getMobile()!=null) {
            throw new RRException("该账号已经绑定过手机号");
        }

        //检查验证码
        if (org.apache.commons.lang.StringUtils.isEmpty(loginParam.getMessageCode())){
            throw new RRException("验证码为空");
        }
        Object obj= redisConfigService.get(Constant.CODE_PREFIX+loginParam.getMobile());
        if (obj == null){
            throw new RRException("请先发送验证码");
        }
        if (!obj.equals(loginParam.getMessageCode())){
            throw new RRException("验证码不正确");
        }

        // 4. 存储mobile字段
        user.setMobile(loginParam.getMobile());
        userService.updateById(user);
    }

    /**
     * 绑定微信流程：
     * 1. app中点击按钮，跳转到微信确认
     * 2. app会收到微信返回的code
     * 3. app将code参数传给后台
     * 4. （绑定微信操作，肯定是在用户登录了的情况，也就是说用户已经存在）
     * 5. 后台查询微信接口，得到用户的openid、昵称等信息
     * 6. 检查该openid是否已经存在了，如果存在表示该微信已经绑定了（返回异常信息）
     * 7. 如果该微信没有被绑定，将微信的openid、昵称等存放到用户表中
     *
     * @return
     */
    @Override
    public void bindWechat(LoginParam loginParam) {
        // 1. 调用微信登录接口
        Map<String, Object> userInfo = wxLoginUtil.getWechatUserInfo(loginParam.getCode());
        String openId = (String) userInfo.get("openid");
        String nickname = (String) userInfo.get("nickname");

        // 2. 在user表中查询该微信的openid是否存在，如果存在抛异常
        User usercheck = userService.getOne(new QueryWrapper<User>().eq("wechat_id", openId));
        if (usercheck != null) {
            throw new RRException("该微信已经绑定过");
        }

        // 3. 获取用户，并设置微信用户名和昵称
        User user = userService.getById(loginParam.getUserId());
        if (StringUtils.isNotEmpty(user.getWechatId())) {
            throw new RRException("该账号已经绑定过微信");
        }
        user.setWechatId(openId);
        user.setWechatName(nickname);
        boolean flag = userService.updateById(user);
    }

    /**
     * 绑定qq流程，和微信类似
     *
     * @return
     */
    @Override
    public void bindQq(LoginParam loginParam) {
        // 1. 调用qq登录接口
        Map<String, Object> userInfo = qqLoginUtil.getQqUserInfo(loginParam);
        String openId = (String) userInfo.get("openid");
        String nickname = (String) userInfo.get("nickname");

        // 2. 在user表中查询该qq的openid是否存在，如果存在抛异常
        User usercheck = userService.getOne(new QueryWrapper<User>().eq("qq_id", openId));
        if (usercheck != null) {
            throw new RRException("该qq已经绑定过");
        }

        // 3. 获取用户，并设置微信用户名和昵称
        User user = userService.getById(loginParam.getUserId());
        if (StringUtils.isNotEmpty(user.getQqId())) {
            throw new RRException("该账号已经绑定过qq");
        }
        user.setQqId(openId);
        user.setQqName(nickname);
        boolean flag = userService.updateById(user);
    }

    /**
     * 解绑三方账号：微信、qq等
     * 这个操作肯定是用户已经登录的情况，所以用户已经存在，不用重新注册
     * 1. 判断用户是否绑定了手机号，如果没有绑定手机号，拒绝解绑操作
     * 2. 如果用户绑定了手机号，根据传入的参数，清空相关的字段
     * <p>
     * 传入的参数，account_type: wechat/qq，判断一下，如果参数不在这个情况，返回异常。
     *
     * @return
     */
    @Override
    public void untieThirdAccount(String accountType, Integer userId) {
        // 1. 判断用户是否绑定了手机号，如果没有绑定手机号，拒绝解绑操作
        User user = userService.getById(userId);
        if (StringUtils.isEmpty(user.getMobile())) {
            throw new RRException("未绑定手机号不能解绑");
        }

        if("wechat".equals(accountType)) {
            user.setWechatId("");
            user.setWechatName("");
            boolean flag = userService.updateById(user);

            if (!flag) {
                throw new RRException("更新失败");
            }
        } else if("qq".equals(accountType)) {
            user.setQqId("");
            user.setQqName("");
            boolean flag = userService.updateById(user);

            if (!flag) {
                throw new RRException("更新失败");
            }
        } else {
            throw new RRException("账户类型不存在");
        }

    }


}
